#ifndef __usart_H
#define __usart_H

#include "my_define.h"

//串口
#define UART_TX_QBUFLEN		2048		//发送缓冲队列总大小
#define UART_RX_QBUFLEN		2048		//接收缓冲队列总大小
#define UART_TX_DATALEN		1024		//发送单条数据最大长度
#define UART_RX_DATALEN		1024		//接收单条数据最大长度
#define UART_TX_QUEUELEN	30			//发送队列数据条数
#define UART_RX_QUEUELEN	30			//接收队列数据条数
#define UART5_BAUD			115200		//波特率
#define UART1_BAUD			115200
#define UART2_BAUD			115200
#define UART3_BAUD			115200
#define UART4_BAUD			115200

//串口队列 1-4收发都是DMA加队列方式
typedef struct 
{
	u16 addr;								//首字节数组下标
	u16 len;								//发送长度
}uart_tx_t;
typedef struct 
{
	u16 first;								//第一个字节数组下标
	u16 last;								//最后一个字节数组下标
}uart_rx_t;

typedef struct
{
	struct{
		u8 busy:1;							
	}flags;						
	uart_tx_t info_queue[UART_TX_QUEUELEN];	//全部指令环形队列
	uart_tx_t info;							//当前取出的指令信息
	u16 front;								//队列头数组下标
	u16 rear;								//队列尾数组下标
	u16 buf_front;							//缓存头数组下标
	u16 buf_rear;							//缓存尾数组下标
}tx_queue_t;
typedef struct
{
	struct{
		u8 busy:1;							
	}flags;						
	uart_rx_t info_queue[UART_RX_QUEUELEN];	//全部指令环形队列
	uart_rx_t info;							//当前取出的指令信息
	u16 front;								//队列头数组下标
	u16 rear;								//队列尾数组下标
	u16 dma_addr;							//当前DMA写到的地址	
}rx_queue_t;

typedef volatile struct{
	u8 txbuf[UART_TX_QBUFLEN];				//初始化串口之后这4个缓冲由队列以及DMA自动调用，不可手动填入数据
	u8 rxbuf[UART_RX_QBUFLEN];
	u8 txdata[UART_TX_DATALEN];
	u8 rxdata[UART_RX_DATALEN];
	tx_queue_t tx_queue;
	rx_queue_t rx_queue;
	void (*rxcallback)(u8 *buf,u16 len);	//一帧数据的接收处理
	void (*clear_tc)(void);					//清除发送完成状态	
	u8 (*get_tc)(void);						//检查发送完成状态位，完成返回1，若此函数为空，队列不会工作
}mUart_t;	//占用超过24K内存
extern mUart_t mUart[4];

//非队列串口
typedef volatile struct{
	struct{
		u8 rxstart:1;
		u8 rxstop:1;
	}flag;
	u8 data;
	u8 rxotime;//接收超时
	u8 rxbuf[UART_RX_DATALEN];				//用于中断接收数据
	u8 txbuf[UART_TX_DATALEN];				//随便用
	u16 rxlen;
	void (*rxcallback)(u8 *buf,u16 len);
}mUart5_t;
extern mUart5_t mUart5;

extern UART_HandleTypeDef huart1;
extern UART_HandleTypeDef huart2;
extern UART_HandleTypeDef huart3;
extern UART_HandleTypeDef huart4;
extern UART_HandleTypeDef huart5;
extern DMA_HandleTypeDef hdma_usart1_rx;
extern DMA_HandleTypeDef hdma_usart1_tx;
extern DMA_HandleTypeDef hdma_usart2_rx;
extern DMA_HandleTypeDef hdma_usart2_tx;
extern DMA_HandleTypeDef hdma_usart3_rx;
extern DMA_HandleTypeDef hdma_usart3_tx;
extern DMA_HandleTypeDef hdma_uart4_rx;
extern DMA_HandleTypeDef hdma_uart4_tx;

void my_uart1_init(void);
void my_uart2_init(void);
void my_uart3_init(void);
void my_uart4_init(void);
void my_uart5_init(void);
void uart1_send(u8 *buf,u16 len);
void uart2_send(u8 *buf,u16 len);
void uart3_send(u8 *buf,u16 len);
void uart4_send(u8 *buf,u16 len);
void uart5_send(u8 *buf,u16 len);
void uart1_send_no_queue(u8 *buf,u16 len);
void uart2_send_no_queue(u8 *buf,u16 len);
u16 uart_tx_get_queue_data_num(u8 n);		//n取值0-4，对应串口1-5
u16 uart_rx_get_queue_data_num(u8 n);
void uart_tx_clear_queue(u8 n);
void uart_rx_clear_queue(u8 n);
void uart_tx_write_to_queue(u8 n,u8 *buf,u16 len);
void uart_rx_write_to_queue(u8 n,u16 first,u16 last);
//void uart_tx_read_from_queue(void);
//void uart_rx_read_from_queue(void);
void Task_uart(void);

void uart_timing(void);
void uart_get_rx_data_it(u8 data);

#endif


